package com.ruoyi.common.utils;

import java.time.*;

public class CardMgtFeeUtil {

    /**
     * 根据开卡时间计算下一个收费日期，并往前推一天
     * @param openCardDateStr 开卡日期字符串，格式为 yyyy-MM-dd
     * @return 下一个收费日期字符串，格式为 yyyy-MM-dd
     */
    public static String calculateNextChargeDate(String openCardDateStr) {
        LocalDate openCardDate = LocalDate.parse(openCardDateStr);

        // 检查是否是月末日期
        if (isLastDayOfMonth(openCardDate)) {
            // 如果是月末，则下个月也应该是月末，然后往前推一天
            LocalDate nextMonth = openCardDate.plusMonths(1);
            return getLastDayOfMonth(nextMonth).minusDays(1).toString();
        } else {
            // 非月末日期，正常加一个月，然后往前推一天
            return openCardDate.plusMonths(1).minusDays(1).toString();
        }
    }


    /**
     * 判断是否是月末日期
     * @param date 日期
     * @return 是否是月末
     */
    private static boolean isLastDayOfMonth(LocalDate date) {
        LocalDate lastDayOfMonth = getLastDayOfMonth(date);
        return date.getDayOfMonth() == lastDayOfMonth.getDayOfMonth();
    }

    /**
     * 获取指定月份的最后一天
     * @param date 日期
     * @return 该月最后一天的日期
     */
    private static LocalDate getLastDayOfMonth(LocalDate date) {
        return YearMonth.from(date).atEndOfMonth();
    }

    /**
     * 判断是否应该收取管理费
     * @param todayStr 当前日期字符串，格式为 yyyy-MM-dd
     * @param nextChargeDateStr 下次收费日期字符串，格式为 yyyy-MM-dd
     * @return 是否应收费
     */
    public static boolean shouldChargeManagementFee(String todayStr, String nextChargeDateStr) {
        LocalDate today = LocalDate.parse(todayStr);
        LocalDate nextChargeDate = LocalDate.parse(nextChargeDateStr);
//        return !today.isBefore(nextChargeDate);
        return today.isAfter(nextChargeDate);
    }

    /**
     * 判断下一次创建时机
     * @param todayStr 当前日期字符串，格式为 yyyy-MM-dd
     * @param nextChargeDateStr 下次收费日期字符串，格式为 yyyy-MM-dd
     * @return 是否应收费
     */
    public static boolean shouldNext(String todayStr, String nextChargeDateStr) {
        LocalDate today = LocalDate.parse(todayStr);
        LocalDate nextChargeDate = LocalDate.parse(nextChargeDateStr);
        return !today.isAfter(nextChargeDate);
    }

    public static void main(String[] args) {
//        String nextChargeDate = CardMgtFeeUtil.calculateNextChargeDate("2024-01-04");
//        System.out.println("月末日期测试: " + nextChargeDate);
//
//        // 测试月末日期 - 1月31日
//        String result1 = CardMgtFeeUtil.calculateNextChargeDate("2024-01-31");
//        System.out.println("1月31日 -> " + result1); // 应该是2月29日(2024年是闰年)
//
//        // 测试月末日期 - 2月28日
//        String result2 = CardMgtFeeUtil.calculateNextChargeDate("2024-02-28");
//        System.out.println("2月28日 -> " + result2); // 应该是3月28日
//
//        // 测试月末日期 - 2月29日
//        String result3 = CardMgtFeeUtil.calculateNextChargeDate("2024-02-29");
//        System.out.println("2月29日 -> " + result3); // 应该是3月31日

        System.out.println("DateUtil.timestampToDateStrToyyyyMMdd() = " + DateUtil.timestampToDateStrToyyyyMMdd());
        boolean b = CardMgtFeeUtil.shouldChargeManagementFee("2025-12-20", "2025-12-19");
        System.out.println("b = " + b);

        String nextChargeDate = CardMgtFeeUtil.calculateNextChargeDate("2025-12-20");
        System.out.println("nextChargeDate = " + nextChargeDate);
    }
}
